{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据分析库\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_dir = '/root/MyCode/Mugulian_Sentiment_Analysis/model/Text/Mugulian_Chinese_Translation/Experiment scripts and related files/Models/eng-fra.txt' \n",
    "data_df = pd.read_csv(data_dir, encoding='UTF-8', sep='\\t', header=None, quoting=3,names=['mn', 'ch'], index_col=False, on_bad_lines='skip')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1244, 2)\n",
      "(1244, 2)\n",
      "['进了客房略微失望。' 'ᠵᠣᠴᠢᠨ\\u202fᠤ᠋ ᠥᠷᠥᠭᠡᠨ\\u202fᠳ᠋ᠦ᠍ ᠣᠷᠣᠭᠠᠳ ᠵᠢᠭᠠᠬᠠᠨ ᠬᠥᠰᠡᠷᠳᠡᠪᠡ ᠃']\n",
      "(2,)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mn</th>\n",
       "      <th>ch</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>进了客房略微失望。</td>\n",
       "      <td>ᠵᠣᠴᠢᠨ ᠤ᠋ ᠥᠷᠥᠭᠡᠨ ᠳ᠋ᠦ᠍ ᠣᠷᠣᠭᠠᠳ ᠵᠢᠭᠠᠬᠠᠨ ᠬᠥᠰᠡᠷᠳᠡᠪᠡ ᠃</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>感觉非常不错。</td>\n",
       "      <td>ᠲᠣᠩ ᠰᠠᠢᠨ ᠰᠠᠨᠠᠭᠳᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠃</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>我亲身去感受了一下，感觉非常失望。</td>\n",
       "      <td>ᠪᠢ ᠪᠡᠶ᠎ᠡ ᠪᠡᠷ ᠢ᠋ᠶ᠋ᠡᠨ ᠣᠴᠢᠵᠤ ᠦᠵᠡᠪᠡ᠂  ᠲᠣᠩ ᠬᠥᠰᠡᠷᠳᠡᠭ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>环境很差，根本无法入睡。</td>\n",
       "      <td>ᠣᠷᠴᠢᠨ ᠲᠣᠭᠣᠷᠢᠨ ᠨᠢ ᠲᠣᠩ ᠮᠠᠭᠤ ᠂ ᠤᠨᠲᠠᠬᠤ ᠶ᠋ᠢᠨ ᠠᠷᠭ᠎ᠠ ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>楼下有迪厅，噪音非常大。</td>\n",
       "      <td>ᠠᠰᠠᠷ ᠳᠣᠣᠷ᠎ᠠ ᠳ᠋ᠢᠰᠺᠣ ᠲᠢᠩᠬᠢᠮ ᠣᠯᠠᠨ᠂  ᠱᠤᠤᠭᠢᠶᠠᠨ ᠶᠡᠬᠡ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  mn                                                 ch\n",
       "0          进了客房略微失望。    ᠵᠣᠴᠢᠨ ᠤ᠋ ᠥᠷᠥᠭᠡᠨ ᠳ᠋ᠦ᠍ ᠣᠷᠣᠭᠠᠳ ᠵᠢᠭᠠᠬᠠᠨ ᠬᠥᠰᠡᠷᠳᠡᠪᠡ ᠃\n",
       "1            感觉非常不错。                        ᠲᠣᠩ ᠰᠠᠢᠨ ᠰᠠᠨᠠᠭᠳᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠃\n",
       "2  我亲身去感受了一下，感觉非常失望。  ᠪᠢ ᠪᠡᠶ᠎ᠡ ᠪᠡᠷ ᠢ᠋ᠶ᠋ᠡᠨ ᠣᠴᠢᠵᠤ ᠦᠵᠡᠪᠡ᠂  ᠲᠣᠩ ᠬᠥᠰᠡᠷᠳᠡᠭ...\n",
       "3       环境很差，根本无法入睡。  ᠣᠷᠴᠢᠨ ᠲᠣᠭᠣᠷᠢᠨ ᠨᠢ ᠲᠣᠩ ᠮᠠᠭᠤ ᠂ ᠤᠨᠲᠠᠬᠤ ᠶ᠋ᠢᠨ ᠠᠷᠭ᠎ᠠ ...\n",
       "4       楼下有迪厅，噪音非常大。  ᠠᠰᠠᠷ ᠳᠣᠣᠷ᠎ᠠ ᠳ᠋ᠢᠰᠺᠣ ᠲᠢᠩᠬᠢᠮ ᠣᠯᠠᠨ᠂  ᠱᠤᠤᠭᠢᠶᠠᠨ ᠶᠡᠬᠡ..."
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(data_df.shape)\n",
    "print(data_df.values.shape)\n",
    "print(data_df.values[0])\n",
    "print(data_df.values[0].shape)\n",
    "data_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 规范化字符串\n",
    "def normalizeString(s):\n",
    "    '''\n",
    "        将出现的多个空格，都使用一个空格代替。例如：w='abc  1   23  1' 处理后：w='abc 1 23 1'\n",
    "    '''\n",
    "    # print(s) # list  ['Go.']\n",
    "    # s = s[0]\n",
    "    s = s.lower().strip()\n",
    "    #s = unicodeToAscii(s)\n",
    "    #s = re.sub(r\"([.!?])\", r\" \\1\", s)  # \\1表示group(1)即第一个匹配到的 即匹配到'.'或者'!'或者'?'后，一律替换成'空格.'或者'空格!'或者'空格？'\n",
    "    #s = re.sub(r\"[^a-zA-Z.!?]+\", r\" \", s)  # 非字母以及非.!?的其他任何字符 一律被替换成空格\n",
    "    s = re.sub(r'[\\s]+', \" \", s)  \n",
    "    return s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "va !\n",
      "go.\n"
     ]
    }
   ],
   "source": [
    "print(normalizeString('Va !'))\n",
    "print(normalizeString('Go.'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "pairs = [[normalizeString(s) for s in line] for line in data_df.values]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pairs num= 1244\n",
      "['进了客房略微失望。', 'ᠵᠣᠴᠢᠨ ᠤ᠋ ᠥᠷᠥᠭᠡᠨ ᠳ᠋ᠦ᠍ ᠣᠷᠣᠭᠠᠳ ᠵᠢᠭᠠᠬᠠᠨ ᠬᠥᠰᠡᠷᠳᠡᠪᠡ ᠃']\n",
      "['感觉非常不错。', 'ᠲᠣᠩ ᠰᠠᠢᠨ ᠰᠠᠨᠠᠭᠳᠠᠵᠤ ᠪᠠᠢᠨ\\u180eᠠ ᠃']\n"
     ]
    }
   ],
   "source": [
    "print('pairs num=', len(pairs))\n",
    "print(pairs[0])\n",
    "print(pairs[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "MAX_LENGTH = 100\n",
    "# 文件是英译法，我们实现的是法译英，所以进行了reverse，所以pair[1]是英语\n",
    "# 为了快速训练，仅保留“我是”“你是”“他是”等简单句子，并且删除原始文本长度大于10个标记的样本\n",
    "def filterPair(p):\n",
    "    return len(p[0].split(' ')) < MAX_LENGTH and len(p[1].split(' ')) < MAX_LENGTH \n",
    "\n",
    "def filterPairs(pairs):\n",
    "    # 过滤，并交换句子顺序，得到法英句子对（之前是英法句子对）\n",
    "    return [[pair[1], pair[0]] for pair in pairs if filterPair(pair)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "filtered_pairs = filterPairs(pairs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'list'>\n"
     ]
    }
   ],
   "source": [
    "print(type(filtered_pairs))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "经过过滤后平行语料数目为： 1244\n",
      "['ᠵᠣᠴᠢᠨ ᠤ᠋ ᠥᠷᠥᠭᠡᠨ ᠳ᠋ᠦ᠍ ᠣᠷᠣᠭᠠᠳ ᠵᠢᠭᠠᠬᠠᠨ ᠬᠥᠰᠡᠷᠳᠡᠪᠡ ᠃', '进了客房略微失望。']\n"
     ]
    }
   ],
   "source": [
    "print('经过过滤后平行语料数目为：', len(filtered_pairs))\n",
    "print(filtered_pairs[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['ᠶᠡᠬᠡ ᠱᠤᠤᠭᠢᠶᠠᠨ ᠲᠠᠢ ᠃', '隔音不好，很吵闹。']\n",
      "(1244, 2)\n"
     ]
    }
   ],
   "source": [
    "print(random.choice(filtered_pairs))\n",
    "print(np.array(filtered_pairs).shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 划分数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 训练集和验证集\n",
    "train_test, val_pairs = train_test_split(filtered_pairs, test_size=0.020, random_state=1234)\n",
    "train_pairs, test_pairs = train_test_split(train_test, test_size=0.020, random_state=1234)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集句子数目： 1194\n",
      "验证集句子数目： 25\n",
      "测试集句子数目： 25\n"
     ]
    }
   ],
   "source": [
    "print('训练集句子数目：', len(train_pairs))\n",
    "print('验证集句子数目：', len(val_pairs))\n",
    "print('测试集句子数目：', len(test_pairs))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['ᠭᠡᠷ ᠲᠦ᠍ ᠢᠳᠡᠬᠦ ᠶᠠᠭᠤᠮ\\u180eᠠ ᠪᠠᠢᠬᠤ ᠦᠭᠡᠢ ᠂ ᠤᠰᠤ ᠴᠤ᠌ ᠪᠠᠢᠬᠤ ᠦᠭᠡᠢ ᠃', '房间没有吃的东西，水也没有。']\n",
      "<class 'list'>\n"
     ]
    }
   ],
   "source": [
    "print(test_pairs[0])\n",
    "print(type(test_pairs))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Data enhence modular"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "from rapidfuzz import fuzz, process  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用RapidFuzzy找到最匹配的句子  \n",
    "def find_best_match(search_sent, sentences):  \n",
    "    match = process.extractOne(search_sent, sentences, score_cutoff=30)  \n",
    "    return match   \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 假设你要搜索的句子是  \n",
    "search_sentence = \"我对客房很失望\"  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 从DataFrame中提取所有句子  \n",
    "sentences = data_df['mn'].tolist()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['进了客房略微失望。', '感觉非常不错。', '我亲身去感受了一下，感觉非常失望。']\n"
     ]
    }
   ],
   "source": [
    "print(sentences[:3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 找到最匹配的句子  \n",
    "best_match = find_best_match(search_sentence, sentences)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最匹配的句子是: 进了房间很失望，床小不说，还设施陈旧。, 匹配度: 51.42857142857142%\n",
      "在DataFrame中的位置（索引）: 331\n"
     ]
    }
   ],
   "source": [
    "if best_match:  \n",
    "    matched_sentence, score, idx = best_match  \n",
    "    print(f\"最匹配的句子是: {matched_sentence}, 匹配度: {score}%\")  \n",
    "    # 你还可以找到这个句子在DataFrame中的位置  \n",
    "    match_index = data_df[data_df['mn'] == matched_sentence].index[0]  \n",
    "    print(f\"在DataFrame中的位置（索引）: {match_index}\")  \n",
    "else:  \n",
    "    print(\"没有找到匹配的句子。\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 构造增强数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 打乱DataFrame的顺序并分离出25%的数据作为查询集  \n",
    "df_random = data_df.sample(frac=1)      # 打乱顺序  \n",
    "query_size = int(len(df_random) * 0.25)  \n",
    "query_df = data_df.head(query_size)  \n",
    "match_df = data_df.tail(len(data_df) - query_size)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 准备一个空列表来存储结果  \n",
    "results = []  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "在DataFrame中的位置（索引）: 994\n",
      "在DataFrame中的位置（索引）: 1119\n",
      "在DataFrame中的位置（索引）: 996\n",
      "在DataFrame中的位置（索引）: 955\n",
      "在DataFrame中的位置（索引）: 590\n",
      "在DataFrame中的位置（索引）: 999\n",
      "在DataFrame中的位置（索引）: 1000\n",
      "在DataFrame中的位置（索引）: 1001\n",
      "在DataFrame中的位置（索引）: 1002\n",
      "在DataFrame中的位置（索引）: 1003\n",
      "在DataFrame中的位置（索引）: 1130\n",
      "在DataFrame中的位置（索引）: 1005\n",
      "在DataFrame中的位置（索引）: 1006\n",
      "在DataFrame中的位置（索引）: 917\n",
      "在DataFrame中的位置（索引）: 1155\n",
      "在DataFrame中的位置（索引）: 840\n",
      "在DataFrame中的位置（索引）: 339\n",
      "在DataFrame中的位置（索引）: 914\n",
      "在DataFrame中的位置（索引）: 1198\n",
      "在DataFrame中的位置（索引）: 444\n",
      "在DataFrame中的位置（索引）: 896\n",
      "在DataFrame中的位置（索引）: 896\n",
      "在DataFrame中的位置（索引）: 1007\n",
      "在DataFrame中的位置（索引）: 697\n",
      "在DataFrame中的位置（索引）: 946\n",
      "在DataFrame中的位置（索引）: 472\n",
      "在DataFrame中的位置（索引）: 373\n",
      "在DataFrame中的位置（索引）: 1196\n",
      "在DataFrame中的位置（索引）: 1013\n",
      "在DataFrame中的位置（索引）: 345\n",
      "在DataFrame中的位置（索引）: 749\n",
      "在DataFrame中的位置（索引）: 684\n",
      "在DataFrame中的位置（索引）: 620\n",
      "在DataFrame中的位置（索引）: 635\n",
      "在DataFrame中的位置（索引）: 850\n",
      "在DataFrame中的位置（索引）: 355\n",
      "在DataFrame中的位置（索引）: 345\n",
      "在DataFrame中的位置（索引）: 339\n",
      "在DataFrame中的位置（索引）: 663\n",
      "在DataFrame中的位置（索引）: 669\n",
      "在DataFrame中的位置（索引）: 709\n",
      "在DataFrame中的位置（索引）: 734\n",
      "在DataFrame中的位置（索引）: 574\n",
      "在DataFrame中的位置（索引）: 968\n",
      "在DataFrame中的位置（索引）: 490\n",
      "在DataFrame中的位置（索引）: 379\n",
      "在DataFrame中的位置（索引）: 800\n",
      "在DataFrame中的位置（索引）: 562\n",
      "在DataFrame中的位置（索引）: 1040\n",
      "在DataFrame中的位置（索引）: 809\n",
      "在DataFrame中的位置（索引）: 673\n",
      "在DataFrame中的位置（索引）: 1129\n",
      "在DataFrame中的位置（索引）: 541\n",
      "在DataFrame中的位置（索引）: 1146\n",
      "在DataFrame中的位置（索引）: 867\n",
      "在DataFrame中的位置（索引）: 1155\n",
      "在DataFrame中的位置（索引）: 752\n",
      "在DataFrame中的位置（索引）: 630\n",
      "在DataFrame中的位置（索引）: 1069\n",
      "在DataFrame中的位置（索引）: 472\n",
      "在DataFrame中的位置（索引）: 361\n",
      "在DataFrame中的位置（索引）: 540\n",
      "在DataFrame中的位置（索引）: 1104\n",
      "在DataFrame中的位置（索引）: 646\n",
      "在DataFrame中的位置（索引）: 742\n",
      "在DataFrame中的位置（索引）: 875\n",
      "在DataFrame中的位置（索引）: 805\n",
      "在DataFrame中的位置（索引）: 910\n",
      "在DataFrame中的位置（索引）: 459\n",
      "在DataFrame中的位置（索引）: 731\n",
      "在DataFrame中的位置（索引）: 1069\n",
      "在DataFrame中的位置（索引）: 959\n",
      "在DataFrame中的位置（索引）: 1036\n",
      "在DataFrame中的位置（索引）: 321\n",
      "在DataFrame中的位置（索引）: 538\n",
      "在DataFrame中的位置（索引）: 539\n",
      "在DataFrame中的位置（索引）: 1162\n",
      "在DataFrame中的位置（索引）: 1228\n",
      "在DataFrame中的位置（索引）: 1211\n",
      "在DataFrame中的位置（索引）: 690\n",
      "在DataFrame中的位置（索引）: 665\n",
      "在DataFrame中的位置（索引）: 1090\n",
      "在DataFrame中的位置（索引）: 1037\n",
      "在DataFrame中的位置（索引）: 1129\n",
      "在DataFrame中的位置（索引）: 561\n",
      "在DataFrame中的位置（索引）: 752\n",
      "在DataFrame中的位置（索引）: 451\n",
      "在DataFrame中的位置（索引）: 1235\n",
      "在DataFrame中的位置（索引）: 808\n",
      "在DataFrame中的位置（索引）: 816\n",
      "在DataFrame中的位置（索引）: 1219\n",
      "在DataFrame中的位置（索引）: 1008\n",
      "在DataFrame中的位置（索引）: 632\n",
      "在DataFrame中的位置（索引）: 696\n",
      "在DataFrame中的位置（索引）: 1173\n",
      "在DataFrame中的位置（索引）: 593\n",
      "在DataFrame中的位置（索引）: 537\n",
      "在DataFrame中的位置（索引）: 1058\n",
      "在DataFrame中的位置（索引）: 600\n",
      "在DataFrame中的位置（索引）: 888\n",
      "在DataFrame中的位置（索引）: 1057\n",
      "在DataFrame中的位置（索引）: 663\n",
      "在DataFrame中的位置（索引）: 634\n",
      "在DataFrame中的位置（索引）: 992\n",
      "在DataFrame中的位置（索引）: 655\n",
      "在DataFrame中的位置（索引）: 630\n",
      "在DataFrame中的位置（索引）: 698\n",
      "在DataFrame中的位置（索引）: 1039\n",
      "在DataFrame中的位置（索引）: 605\n",
      "在DataFrame中的位置（索引）: 728\n",
      "在DataFrame中的位置（索引）: 600\n",
      "在DataFrame中的位置（索引）: 798\n",
      "在DataFrame中的位置（索引）: 321\n",
      "在DataFrame中的位置（索引）: 750\n",
      "在DataFrame中的位置（索引）: 339\n",
      "在DataFrame中的位置（索引）: 619\n",
      "在DataFrame中的位置（索引）: 318\n",
      "在DataFrame中的位置（索引）: 673\n",
      "在DataFrame中的位置（索引）: 787\n",
      "在DataFrame中的位置（索引）: 428\n",
      "在DataFrame中的位置（索引）: 801\n",
      "在DataFrame中的位置（索引）: 919\n",
      "在DataFrame中的位置（索引）: 799\n",
      "在DataFrame中的位置（索引）: 896\n",
      "在DataFrame中的位置（索引）: 1002\n",
      "在DataFrame中的位置（索引）: 770\n",
      "在DataFrame中的位置（索引）: 1128\n",
      "在DataFrame中的位置（索引）: 739\n",
      "在DataFrame中的位置（索引）: 607\n",
      "在DataFrame中的位置（索引）: 591\n",
      "在DataFrame中的位置（索引）: 662\n",
      "在DataFrame中的位置（索引）: 822\n",
      "在DataFrame中的位置（索引）: 951\n",
      "在DataFrame中的位置（索引）: 579\n",
      "在DataFrame中的位置（索引）: 835\n",
      "在DataFrame中的位置（索引）: 336\n",
      "在DataFrame中的位置（索引）: 768\n",
      "在DataFrame中的位置（索引）: 872\n",
      "在DataFrame中的位置（索引）: 343\n",
      "在DataFrame中的位置（索引）: 846\n",
      "在DataFrame中的位置（索引）: 976\n",
      "在DataFrame中的位置（索引）: 1016\n",
      "在DataFrame中的位置（索引）: 869\n",
      "在DataFrame中的位置（索引）: 826\n",
      "在DataFrame中的位置（索引）: 339\n",
      "在DataFrame中的位置（索引）: 565\n",
      "在DataFrame中的位置（索引）: 865\n",
      "在DataFrame中的位置（索引）: 389\n",
      "在DataFrame中的位置（索引）: 745\n",
      "在DataFrame中的位置（索引）: 633\n",
      "在DataFrame中的位置（索引）: 768\n",
      "在DataFrame中的位置（索引）: 867\n",
      "在DataFrame中的位置（索引）: 322\n",
      "在DataFrame中的位置（索引）: 750\n",
      "在DataFrame中的位置（索引）: 537\n",
      "在DataFrame中的位置（索引）: 652\n",
      "在DataFrame中的位置（索引）: 590\n",
      "在DataFrame中的位置（索引）: 580\n",
      "在DataFrame中的位置（索引）: 1069\n",
      "在DataFrame中的位置（索引）: 1034\n",
      "在DataFrame中的位置（索引）: 751\n",
      "在DataFrame中的位置（索引）: 579\n",
      "在DataFrame中的位置（索引）: 888\n",
      "在DataFrame中的位置（索引）: 362\n",
      "在DataFrame中的位置（索引）: 869\n",
      "在DataFrame中的位置（索引）: 436\n",
      "在DataFrame中的位置（索引）: 950\n",
      "在DataFrame中的位置（索引）: 1129\n",
      "在DataFrame中的位置（索引）: 959\n",
      "在DataFrame中的位置（索引）: 467\n",
      "在DataFrame中的位置（索引）: 637\n",
      "在DataFrame中的位置（索引）: 755\n",
      "在DataFrame中的位置（索引）: 437\n",
      "在DataFrame中的位置（索引）: 972\n",
      "在DataFrame中的位置（索引）: 848\n",
      "在DataFrame中的位置（索引）: 897\n",
      "在DataFrame中的位置（索引）: 749\n",
      "在DataFrame中的位置（索引）: 543\n",
      "在DataFrame中的位置（索引）: 946\n",
      "在DataFrame中的位置（索引）: 731\n",
      "在DataFrame中的位置（索引）: 1053\n",
      "在DataFrame中的位置（索引）: 645\n",
      "在DataFrame中的位置（索引）: 1228\n",
      "在DataFrame中的位置（索引）: 800\n",
      "在DataFrame中的位置（索引）: 455\n",
      "在DataFrame中的位置（索引）: 1114\n",
      "在DataFrame中的位置（索引）: 472\n",
      "在DataFrame中的位置（索引）: 554\n",
      "在DataFrame中的位置（索引）: 367\n",
      "在DataFrame中的位置（索引）: 609\n",
      "在DataFrame中的位置（索引）: 714\n",
      "在DataFrame中的位置（索引）: 320\n",
      "在DataFrame中的位置（索引）: 1013\n",
      "在DataFrame中的位置（索引）: 472\n",
      "在DataFrame中的位置（索引）: 666\n",
      "在DataFrame中的位置（索引）: 1002\n",
      "在DataFrame中的位置（索引）: 593\n",
      "在DataFrame中的位置（索引）: 568\n",
      "在DataFrame中的位置（索引）: 1057\n",
      "在DataFrame中的位置（索引）: 451\n",
      "在DataFrame中的位置（索引）: 637\n",
      "在DataFrame中的位置（索引）: 826\n",
      "在DataFrame中的位置（索引）: 731\n",
      "在DataFrame中的位置（索引）: 897\n",
      "在DataFrame中的位置（索引）: 809\n",
      "在DataFrame中的位置（索引）: 557\n",
      "在DataFrame中的位置（索引）: 1118\n",
      "在DataFrame中的位置（索引）: 633\n",
      "在DataFrame中的位置（索引）: 911\n",
      "在DataFrame中的位置（索引）: 666\n",
      "在DataFrame中的位置（索引）: 1090\n",
      "在DataFrame中的位置（索引）: 336\n",
      "在DataFrame中的位置（索引）: 518\n",
      "在DataFrame中的位置（索引）: 630\n",
      "在DataFrame中的位置（索引）: 1155\n",
      "在DataFrame中的位置（索引）: 774\n",
      "在DataFrame中的位置（索引）: 541\n",
      "在DataFrame中的位置（索引）: 557\n",
      "在DataFrame中的位置（索引）: 626\n",
      "在DataFrame中的位置（索引）: 1228\n",
      "在DataFrame中的位置（索引）: 935\n",
      "在DataFrame中的位置（索引）: 348\n",
      "在DataFrame中的位置（索引）: 566\n",
      "在DataFrame中的位置（索引）: 336\n",
      "在DataFrame中的位置（索引）: 1104\n",
      "在DataFrame中的位置（索引）: 351\n",
      "在DataFrame中的位置（索引）: 1211\n",
      "在DataFrame中的位置（索引）: 339\n",
      "在DataFrame中的位置（索引）: 798\n",
      "在DataFrame中的位置（索引）: 806\n",
      "在DataFrame中的位置（索引）: 878\n",
      "在DataFrame中的位置（索引）: 1022\n",
      "在DataFrame中的位置（索引）: 634\n",
      "在DataFrame中的位置（索引）: 846\n",
      "在DataFrame中的位置（索引）: 1073\n",
      "在DataFrame中的位置（索引）: 847\n",
      "在DataFrame中的位置（索引）: 455\n",
      "在DataFrame中的位置（索引）: 958\n",
      "在DataFrame中的位置（索引）: 617\n",
      "在DataFrame中的位置（索引）: 672\n",
      "在DataFrame中的位置（索引）: 869\n",
      "在DataFrame中的位置（索引）: 951\n",
      "在DataFrame中的位置（索引）: 535\n",
      "在DataFrame中的位置（索引）: 791\n",
      "在DataFrame中的位置（索引）: 826\n",
      "在DataFrame中的位置（索引）: 796\n",
      "在DataFrame中的位置（索引）: 481\n",
      "在DataFrame中的位置（索引）: 592\n",
      "在DataFrame中的位置（索引）: 642\n",
      "在DataFrame中的位置（索引）: 455\n",
      "在DataFrame中的位置（索引）: 646\n",
      "在DataFrame中的位置（索引）: 782\n",
      "在DataFrame中的位置（索引）: 751\n",
      "在DataFrame中的位置（索引）: 639\n",
      "在DataFrame中的位置（索引）: 850\n",
      "在DataFrame中的位置（索引）: 318\n",
      "在DataFrame中的位置（索引）: 748\n",
      "在DataFrame中的位置（索引）: 662\n",
      "在DataFrame中的位置（索引）: 389\n",
      "在DataFrame中的位置（索引）: 687\n",
      "在DataFrame中的位置（索引）: 579\n",
      "在DataFrame中的位置（索引）: 1095\n",
      "在DataFrame中的位置（索引）: 802\n",
      "在DataFrame中的位置（索引）: 1221\n",
      "在DataFrame中的位置（索引）: 489\n",
      "在DataFrame中的位置（索引）: 1114\n",
      "在DataFrame中的位置（索引）: 1162\n",
      "在DataFrame中的位置（索引）: 426\n",
      "在DataFrame中的位置（索引）: 756\n",
      "在DataFrame中的位置（索引）: 522\n",
      "在DataFrame中的位置（索引）: 1090\n",
      "在DataFrame中的位置（索引）: 1091\n",
      "在DataFrame中的位置（索引）: 1092\n",
      "在DataFrame中的位置（索引）: 633\n",
      "在DataFrame中的位置（索引）: 558\n",
      "在DataFrame中的位置（索引）: 806\n",
      "在DataFrame中的位置（索引）: 649\n",
      "在DataFrame中的位置（索引）: 745\n",
      "在DataFrame中的位置（索引）: 379\n",
      "在DataFrame中的位置（索引）: 1206\n",
      "在DataFrame中的位置（索引）: 1210\n",
      "在DataFrame中的位置（索引）: 436\n",
      "在DataFrame中的位置（索引）: 840\n",
      "在DataFrame中的位置（索引）: 979\n",
      "在DataFrame中的位置（索引）: 691\n",
      "在DataFrame中的位置（索引）: 559\n",
      "在DataFrame中的位置（索引）: 905\n",
      "在DataFrame中的位置（索引）: 1215\n",
      "在DataFrame中的位置（索引）: 553\n",
      "在DataFrame中的位置（索引）: 597\n",
      "在DataFrame中的位置（索引）: 847\n",
      "在DataFrame中的位置（索引）: 554\n",
      "在DataFrame中的位置（索引）: 1173\n",
      "在DataFrame中的位置（索引）: 959\n",
      "在DataFrame中的位置（索引）: 998\n",
      "在DataFrame中的位置（索引）: 734\n",
      "在DataFrame中的位置（索引）: 1208\n",
      "在DataFrame中的位置（索引）: 1225\n",
      "在DataFrame中的位置（索引）: 850\n",
      "在DataFrame中的位置（索引）: 780\n",
      "在DataFrame中的位置（索引）: 607\n",
      "在DataFrame中的位置（索引）: 731\n",
      "在DataFrame中的位置（索引）: 552\n",
      "在DataFrame中的位置（索引）: 1018\n",
      "在DataFrame中的位置（索引）: 1049\n",
      "在DataFrame中的位置（索引）: 1130\n",
      "在DataFrame中的位置（索引）: 1236\n",
      "在DataFrame中的位置（索引）: 1237\n",
      "在DataFrame中的位置（索引）: 325\n",
      "在DataFrame中的位置（索引）: 564\n"
     ]
    }
   ],
   "source": [
    "# 对查询集中的每一项进行模糊搜索  \n",
    "for index, query_row in query_df.iterrows():  \n",
    "    query_sentence = query_row['mn']  \n",
    "    # 在匹配集中进行模糊搜索  \n",
    "    matches = process.extract(query_sentence, match_df['mn'], limit=1, scorer=fuzz.ratio, score_cutoff=30)  \n",
    "    if matches:  \n",
    "        matched_sentence, score, match_idx = matches[0]  \n",
    "        # 找到匹配句子在原始DataFrame中的mn值（可选）  \n",
    "        #match_mn = match_df.iloc[match_idx]['mn']  \n",
    "        match_index = match_df[match_df['mn'] == matched_sentence].index[0]  \n",
    "        print(f\"在DataFrame中的位置（索引）: {match_index}\")  \n",
    "        # 拼接查询句子和匹配句子，并添加到结果列表中  \n",
    "        # results.append((query_sentence, matched_sentence, score, query_row['ch'], match_index))  \n",
    "        results.append((query_sentence, matched_sentence, query_row['ch']))  \n",
    "    else:  \n",
    "        # results.append((query_sentence, None, 0, query_row['mn'], None))  \n",
    "        results.append((query_sentence, None, query_row['ch']))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('进了客房略微失望。', '高价定的房间，进了客房略微失望。', 'ᠵᠣᠴᠢᠨ\\u202fᠤ᠋ ᠥᠷᠥᠭᠡᠨ\\u202fᠳ᠋ᠦ᠍ ᠣᠷᠣᠭᠠᠳ ᠵᠢᠭᠠᠬᠠᠨ ᠬᠥᠰᠡᠷᠳᠡᠪᠡ ᠃'), ('感觉非常不错。', '这家酒店感觉非常的不满意。', 'ᠲᠣᠩ ᠰᠠᠢᠨ ᠰᠠᠨᠠᠭᠳᠠᠵᠤ ᠪᠠᠢᠨ\\u180eᠠ ᠃'), ('我亲身去感受了一下，感觉非常失望。', '亲身来这家酒店感受了一下，感觉非常失望。', 'ᠪᠢ ᠪᠡᠶ\\u180eᠡ\\u202fᠪᠡᠷ\\u202fᠢ᠋ᠶ᠋ᠡᠨ ᠣᠴᠢᠵᠤ ᠦᠵᠡᠪᠡ᠂  ᠲᠣᠩ ᠬᠥᠰᠡᠷᠳᠡᠭᠰᠡᠨ ᠰᠢᠭ ᠰᠠᠨᠠᠭᠳᠠᠵᠤ ᠪᠠᠢᠨ\\u180eᠠ ᠃')]\n"
     ]
    }
   ],
   "source": [
    "print(results[:3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将结果转换为DataFrame  \n",
    "# results_df = pd.DataFrame(results, columns=['Query Sentence', 'Matched Sentence', 'Score', 'Query MN', 'Matched MN'])  \n",
    "results_df = pd.DataFrame(results, columns=['Query Sentence', 'Matched Sentence', 'Trans'])  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                 Query Sentence Matched Sentence  \\\n",
      "0                     进了客房略微失望。             None   \n",
      "1                       感觉非常不错。             None   \n",
      "2             我亲身去感受了一下，感觉非常失望。             None   \n",
      "3                  环境很差，根本无法入睡。             None   \n",
      "4                  楼下有迪厅，噪音非常大。             None   \n",
      "...                         ...              ...   \n",
      "1239               不值这个价格，性价比差。    价格非常不值，性价比太差。   \n",
      "1240     酒店通道和房间的异味特别浓烈，晚上无法入睡。  酒店通道和房间的异味特别浓烈。   \n",
      "1241         房间设施过于简易，淋浴的水流特别小。        房间设施过于简易。   \n",
      "1242  房间没有吹风机，洗好头发后需要向客服借用，很麻烦。   房间内设备陈旧，没有吹风机。   \n",
      "1243              出行不方便，地点比较偏僻。   出行不方便，附近没有地铁站。   \n",
      "\n",
      "                                                  Score           Query MN  \\\n",
      "0                                                     0          进了客房略微失望。   \n",
      "1                                                     0            感觉非常不错。   \n",
      "2                                                     0  我亲身去感受了一下，感觉非常失望。   \n",
      "3                                                     0       环境很差，根本无法入睡。   \n",
      "4                                                     0       楼下有迪厅，噪音非常大。   \n",
      "...                                                 ...                ...   \n",
      "1239  ᠡᠨᠡ ᠦᠨ᠎ᠡ ᠶ᠋ᠢᠨ ᠴᠢᠨᠠᠷᠲᠠᠢ ᠦᠨ᠎ᠡ ᠶ᠋ᠢᠨ ᠬᠠᠷᠢᠴᠠᠭ᠎ᠠ ᠮᠠᠭ...               None   \n",
      "1240  ᠪᠠᠭᠤᠳᠠᠯ ᠤ᠋ᠨ ᠨᠡᠪᠲᠡᠷᠡᠬᠦ ᠵᠠᠮ ᠪᠣᠯᠤᠨ ᠥᠷᠥᠭᠡᠨ ᠦ᠌ ᠥᠪᠡᠷ...               None   \n",
      "1241  ᠥᠷᠥᠭᠡᠨ ᠦ᠌ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠨᠢ ᠬᠡᠳᠦ ᠳᠥᠭᠥᠮ ᠰᠦᠷᠴᠢᠭᠦᠯ ᠤ...               None   \n",
      "1242  ᠥᠷᠥᠭᠡᠨ ᠳ᠋ᠦ᠍ ᠭᠡᠵᠢᠭᠡ ᠬᠠᠲᠠᠭᠠᠬᠤ ᠮᠠᠰᠢᠨ ᠦᠭᠡᠢ ᠪᠣᠯ ᠭᠡᠵ...               None   \n",
      "1243  ᠶᠠᠪᠤᠵᠤ ᠰᠠᠭᠤᠬᠤ ᠳ᠋ᠤ᠌ ᠳᠥᠭᠥᠮ ᠦᠭᠡᠢ ᠂ ᠭᠠᠵᠠᠷ ᠣᠷᠣᠨ ᠬᠠᠷ...               None   \n",
      "\n",
      "      Matched MN  \n",
      "0            NaN  \n",
      "1            NaN  \n",
      "2            NaN  \n",
      "3            NaN  \n",
      "4            NaN  \n",
      "...          ...  \n",
      "1239         NaN  \n",
      "1240         NaN  \n",
      "1241         NaN  \n",
      "1242         NaN  \n",
      "1243         NaN  \n",
      "\n",
      "[1244 rows x 5 columns]\n"
     ]
    }
   ],
   "source": [
    "print(results_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Query Sentence</th>\n",
       "      <th>Matched Sentence</th>\n",
       "      <th>Trans</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>进了客房略微失望。</td>\n",
       "      <td>高价定的房间，进了客房略微失望。</td>\n",
       "      <td>ᠵᠣᠴᠢᠨ ᠤ᠋ ᠥᠷᠥᠭᠡᠨ ᠳ᠋ᠦ᠍ ᠣᠷᠣᠭᠠᠳ ᠵᠢᠭᠠᠬᠠᠨ ᠬᠥᠰᠡᠷᠳᠡᠪᠡ ᠃</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>感觉非常不错。</td>\n",
       "      <td>这家酒店感觉非常的不满意。</td>\n",
       "      <td>ᠲᠣᠩ ᠰᠠᠢᠨ ᠰᠠᠨᠠᠭᠳᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠃</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>我亲身去感受了一下，感觉非常失望。</td>\n",
       "      <td>亲身来这家酒店感受了一下，感觉非常失望。</td>\n",
       "      <td>ᠪᠢ ᠪᠡᠶ᠎ᠡ ᠪᠡᠷ ᠢ᠋ᠶ᠋ᠡᠨ ᠣᠴᠢᠵᠤ ᠦᠵᠡᠪᠡ᠂  ᠲᠣᠩ ᠬᠥᠰᠡᠷᠳᠡᠭ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>环境很差，根本无法入睡。</td>\n",
       "      <td>酒店环境及其恶劣，完全无法入睡。</td>\n",
       "      <td>ᠣᠷᠴᠢᠨ ᠲᠣᠭᠣᠷᠢᠨ ᠨᠢ ᠲᠣᠩ ᠮᠠᠭᠤ ᠂ ᠤᠨᠲᠠᠬᠤ ᠶ᠋ᠢᠨ ᠠᠷᠭ᠎ᠠ ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>楼下有迪厅，噪音非常大。</td>\n",
       "      <td>空调噪音非常大。</td>\n",
       "      <td>ᠠᠰᠠᠷ ᠳᠣᠣᠷ᠎ᠠ ᠳ᠋ᠢᠰᠺᠣ ᠲᠢᠩᠬᠢᠮ ᠣᠯᠠᠨ᠂  ᠱᠤᠤᠭᠢᠶᠠᠨ ᠶᠡᠬᠡ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      Query Sentence      Matched Sentence  \\\n",
       "0          进了客房略微失望。      高价定的房间，进了客房略微失望。   \n",
       "1            感觉非常不错。         这家酒店感觉非常的不满意。   \n",
       "2  我亲身去感受了一下，感觉非常失望。  亲身来这家酒店感受了一下，感觉非常失望。   \n",
       "3       环境很差，根本无法入睡。      酒店环境及其恶劣，完全无法入睡。   \n",
       "4       楼下有迪厅，噪音非常大。              空调噪音非常大。   \n",
       "\n",
       "                                               Trans  \n",
       "0    ᠵᠣᠴᠢᠨ ᠤ᠋ ᠥᠷᠥᠭᠡᠨ ᠳ᠋ᠦ᠍ ᠣᠷᠣᠭᠠᠳ ᠵᠢᠭᠠᠬᠠᠨ ᠬᠥᠰᠡᠷᠳᠡᠪᠡ ᠃  \n",
       "1                        ᠲᠣᠩ ᠰᠠᠢᠨ ᠰᠠᠨᠠᠭᠳᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠃  \n",
       "2  ᠪᠢ ᠪᠡᠶ᠎ᠡ ᠪᠡᠷ ᠢ᠋ᠶ᠋ᠡᠨ ᠣᠴᠢᠵᠤ ᠦᠵᠡᠪᠡ᠂  ᠲᠣᠩ ᠬᠥᠰᠡᠷᠳᠡᠭ...  \n",
       "3  ᠣᠷᠴᠢᠨ ᠲᠣᠭᠣᠷᠢᠨ ᠨᠢ ᠲᠣᠩ ᠮᠠᠭᠤ ᠂ ᠤᠨᠲᠠᠬᠤ ᠶ᠋ᠢᠨ ᠠᠷᠭ᠎ᠠ ...  \n",
       "4  ᠠᠰᠠᠷ ᠳᠣᠣᠷ᠎ᠠ ᠳ᠋ᠢᠰᠺᠣ ᠲᠢᠩᠬᠢᠮ ᠣᠯᠠᠨ᠂  ᠱᠤᠤᠭᠢᠶᠠᠨ ᠶᠡᠬᠡ...  "
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Paragraph split method \n",
    "(进了客房略微失望) 高价定的房间，进了客房略微失望。\n",
    "(感觉非常) [不错。]\t 这家酒店感觉非常的不满意。  (感觉非常) 这家酒店感觉非常的不满意。\n",
    "[进,客房,失望] [高价,定,房间,进,客房,略微,失望] -> (进,客房,进,失望) [高价,定,房间,进,客房,略微,失望]\n",
    "[进,客,房,失望] [高价,定,房间,进,客房,略微,失望] -> (进,客房,进,失望) [高价,定,房间,进,客房,略微,失望]"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "science39",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.18"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
